package com.tms.basic.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tms.basic.pojo.domain.Driver;
import com.tms.basic.pojo.req.DriverQueryReq;
import com.tms.basic.pojo.vo.DriverVO;
import com.tms.common.core.domain.R;

import java.util.List;
import java.util.Map;

/**
 * 驾驶员信息服务接口
 *
 * @author TMS
 * @since 2024-01-01
 */
public interface DriverService extends IService<Driver> {

    /**
     * 分页查询驾驶员信息
     *
     * @param req 查询条件
     * @return 驾驶员信息分页结果
     */
    R<IPage<DriverVO>> getDriverPage(DriverQueryReq req);

    /**
     * 根据条件查询驾驶员信息列表
     *
     * @param req 查询条件
     * @return 驾驶员信息列表
     */
    R<List<DriverVO>> getDriverList(DriverQueryReq req);

    /**
     * 根据ID查询驾驶员详细信息（包含驾驶证信息）
     *
     * @param id 驾驶员ID
     * @return 驾驶员详细信息
     */
    R<DriverVO> getDriverById(Long id);

    /**
     * 根据手机号查询驾驶员信息
     *
     * @param phoneNumber 手机号
     * @return 驾驶员信息
     */
    R<DriverVO> getDriverByPhoneNumber(String phoneNumber);

    /**
     * 根据身份证号查询驾驶员信息
     *
     * @param idCardNumber 身份证号
     * @return 驾驶员信息
     */
    R<DriverVO> getDriverByIdCardNumber(String idCardNumber);

    /**
     * 新增驾驶员信息
     *
     * @param driver 驾驶员信息
     * @return 新增结果
     */
    R<Boolean> addDriver(Driver driver);

    /**
     * 修改驾驶员信息
     *
     * @param driver 驾驶员信息
     * @return 修改结果
     */
    R<Boolean> updateDriver(Driver driver);

    /**
     * 删除驾驶员信息
     *
     * @param id 驾驶员ID
     * @return 删除结果
     */
    R<Boolean> deleteDriver(Long id);

    /**
     * 批量删除驾驶员信息
     *
     * @param ids 驾驶员ID列表
     * @return 删除结果
     */
    R<Boolean> deleteDriverBatch(List<Long> ids);

    /**
     * 更新驾驶员状态
     *
     * @param id     驾驶员ID
     * @param status 新状态
     * @return 更新结果
     */
    R<Boolean> updateDriverStatus(Long id, Integer status);

    /**
     * 查询驾照即将到期的驾驶员（30天内到期）
     *
     * @param days 提前天数，默认30天
     * @return 驾照即将到期的驾驶员列表
     */
    R<List<DriverVO>> getLicenseExpiringDrivers(Integer days);

    /**
     * 根据状态统计驾驶员数量
     *
     * @param organizationId 机构ID
     * @return 驾驶员状态统计结果
     */
    R<List<Map<String, Object>>> countDriverByStatus(Long organizationId);

    /**
     * 查询空闲的驾驶员
     *
     * @param licenseType    驾照类型（可选）
     * @param organizationId 机构ID（可选）
     * @return 空闲驾驶员列表
     */
    R<List<DriverVO>> getAvailableDrivers(String licenseType, Long organizationId);

    /**
     * 检查手机号是否已存在
     *
     * @param phoneNumber 手机号
     * @param excludeId   排除的驾驶员ID（用于修改时排除自己）
     * @return 是否存在
     */
    boolean isPhoneNumberExists(String phoneNumber, Long excludeId);

    /**
     * 检查身份证号是否已存在
     *
     * @param idCardNumber 身份证号
     * @param excludeId    排除的驾驶员ID（用于修改时排除自己）
     * @return 是否存在
     */
    boolean isIdCardNumberExists(String idCardNumber, Long excludeId);
} 